[HCTF 2018]WarmUp

[HCTF 2018]WarmUp

(1)开局一张滑稽脸。

图片.png

(2)查看源代码,得到提示
图片.png

(3)打开提示页面,又获得一个提示页面
图片.png

(4)看看另外一个提示的页面
图片.png
提示了flag在ffffllllaaaagggg

(5)回到sourch.php页面简单解读一下源码

<?php
highlight_file(__FILE__);//highlight_file()函数输出一个突出显示PHP语法的文件。(打印以下代码)
class emmm
{
    public static function checkFile(&$page)
    {
        $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//定义一个白名单
        if (! isset($page) || !is_string($page)) {      //判断$page是否不为空或是否不是字符串,是则返回false和打印"you can't see it"。
            
            echo "you can't see it";
            return false;
        }

        if (in_array($page, $whitelist)) {        //从$whitelist中查找是否有$page有则返回true
            return true;
        }

        $_page = mb_substr(          //截取参数中的?之前的一部分,如果没有?则,截取所有参数。
            $page,
            0,
            mb_strpos($page . '?', '?')   //$page . '?'是指$page的值与?拼接在一起
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        $_page = urldecode($page);//定义$_page的值为$page的url解码(说实话这步解码觉得没啥意义)
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }
        echo "you can't see it";
        return false;
    }
}

if (! empty($_REQUEST['file'])//要求传入的 file变量的值需要满足:非空,字符串,能通过 checkFile()函数
    && is_string($_REQUEST['file'])
    && emmm::checkFile($_REQUEST['file'])
) {
    include $_REQUEST['file']; //包含$_REQUEST['file']文件
    exit;
} else {
    echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}   //打印滑稽表情
?> 

即要给参数file传值,要求传入的 file变量的值需要满足:非空,字符串,能通过 checkFile()函数。

(6)构造file的值

a.符合whitelist里面的值file=hint.php/source.php(两个都可以)

b.第一个判断$page是否在$whitelist数组中,无论有没有并不会影响file通过 checkFile()函数,所以可以忽略不计。

c.看到include 和上面的checkfile我们就很敏感的得知是利用include。我们知道如果直接放入hint.php?ffffllllaaaaggg会通过checkFile的验证返回true,但是毫无疑问这种错误的文件名是无法被include正确读取的,所以正确为hint.php?/ffffllllaaaagggg。

d.截取$page中’?’前一部分判断是否$whitelist数组中 ,判断url解码并截取了’?’前一部分的$page是否存在于$whitelist中;(‘?’url解码后还是’?’,影响不大)

e.初步猜测为

 ?file=hint.php?/ffffllllaaaagggg

f.经过测试发现无返回值,这可能是因为我们不知道ffffllllaaaagggg文件存放的具体位置,所以依次增加../(不断返回上一级目录),最终成功拿到flag。

图片.png

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信